package LimitedTimeGame.Day_0207;

/**
 * @author zxc
 * @date 2023/02/07 08:58
 **/

import java.util.*;
import java.util.stream.Collectors;

/**
 * 题目 ：警告一个小时内使用员工卡 大于等于三次的人
 * 题目详述 :
 * 力扣公司的员工都使用员工卡来开办公室的门。
 * 每当一个员工使用一次他的员工卡，安保系统会记录下员工的名字和使用时间。
 * 如果一个员工在一小时时间内使用员工卡的次数大于等于三次，这个系统会自动发布一个 警告。
 * 给你字符串数组keyName和keyTime ，其中[keyName[i], keyTime[i]]对应一个人的名字和他在某一天 内使用员工卡的时间。
 * 使用时间的格式是 24小时制，形如"HH:MM"，比方说"23:51" 和"09:49"。
 * 请你返回去重后的收到系统警告的员工名字，将它们按 字典序升序排序后返回。
 * 请注意"10:00" - "11:00"视为一个小时时间范围内，而"23:51" - "00:10"不被视为一小时内，因为系统记录的是某一天内的使用情况。
 *
 * 提示：
 * 1 <= keyName.length, keyTime.length <= 105
 * keyName.length == keyTime.length
 * keyTime 格式为"HH:MM"。
 * 保证[keyName[i], keyTime[i]]形成的二元对互不相同。
 * 1 <= keyName[i].length <= 10
 * keyName[i]只包含小写英文字母。
 *
 */
public class AlertNames {
    /**
     * 思路 ：
     * （1）哈希表 + Set集合 ：hashmap用来存储员工以及其刷门禁卡时间; Set集合，则是保存员工名字;
     * （2）哈希表 ：即，String类型存储员工名字 && List<String>类型，存储刷门禁卡时间;
     * （3）遍历所有员工 && 对于其刷门禁卡时间进行排序;
     *  若是一个小时内刷超过三次卡，即代表了其被记录;
     *  ===> 即，将该员工记录到result集合中 && break跳出循环;
     * （4）对于result集合借助Collections工具类进行排序;
     *
     * @param keyName
     * @param keyTime
     * @return
     */
    public List<String> alertNames(String[] keyName, String[] keyTime) {
        List<String> result = new ArrayList<>();
        Set<String> set = new HashSet<>();
        HashMap<String , List<String>> hashMap = new HashMap<>();
        int nameLen = keyName.length;
        for(int i = 0 ; i < nameLen ; i++){
            set.add(keyName[i]);
            List<String> list = hashMap.get(keyName[i]) != null ? hashMap.get(keyName[i]) : new ArrayList<>();
            list.add(keyTime[i]);
            hashMap.put(keyName[i] , list);
        }

        for (String element : set) {
            List<String> list = hashMap.get(element);
            Collections.sort(list);
            int length = list.size();
            for(int i = 0 ; i < length - 2 ; i++){
                String finalTime = list.get(i + 2);
                String startTime = list.get(i);
                Integer finalHour = Integer.valueOf(finalTime.substring(0,2));
                Integer startHour = Integer.valueOf(startTime.substring(0,2));
                Integer finalMinute = Integer.valueOf(finalTime.substring(3,5));
                Integer startMinute = Integer.valueOf(startTime.substring(3,5));
                if(finalHour - startHour == 0 || (finalHour - startHour == 1 && finalMinute <= startMinute)){
                    result.add(element);
                    break;
                }
            }
        }
        Collections.sort(result);
        return result;
    }
}
